package com.pisolution.scheduler.runtime.master.dispatcher.executor;

import com.pisolution.scheduler.core.tuple.Tuple3;
import com.pisolution.scheduler.remote.command.Command;
import com.pisolution.scheduler.remote.utils.Host;

/**
 * 组件信息交互管理管理器.
 *
 * @param <T> 指令执行的响应结果类型.
 *
 * @author sora
 * @version 0.1.0
 */
public interface ExecutorManager<T> {
    /**
     * 指令执行前的准备工作.
     *
     * @param context 待执行指令上下文信息.
     *
     * @throws Exception 如果准备过程中出现异常.
     */
    default void beforeExecute(final Tuple3<Host, Command, String> context) throws Exception {
        if (context == null) {
            throw new Exception("The context given is null.");
        }
    }

    /**
     * 执行指令并获取响应结果.
     *
     * @param context 待执行指令上下文信息.
     *
     * @return 指令执行结束的响应信息.
     *
     * @throws Exception 如果执行过程中出现异常.
     */
    T execute(final Tuple3<Host, Command, String> context) throws Exception;

    /**
     * 指令执行后的清理工作.
     *
     * @param context 待执行指令上下文信息.
     *
     * @throws Exception 如果清理过程中出现异常.
     */
    default void afterExecute(final Tuple3<Host, Command, String> context) throws Exception {
        if (context == null) {
            throw new Exception("The context given is null.");
        }
    }

    /**
     * 直接执行指令 无需等待响应结果.
     *
     * @param context 待执行指令上下文信息.
     *
     * @throws Exception 如果执行过程中出现异常.
     */
    void executeDirectly(final Tuple3<Host, Command, String> context) throws Exception;
}
